home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dmove86 / dmrename.c < prev    next >
Text File  |  1995-02-15  |  5KB  |  270 lines

  1. /*
  2.  
  3. dmrename.c -- Renameコマンド
  4.  
  5. */
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<ctype.h>
  10. #include<dos.h>
  11. #include"dmove86.h"
  12.  
  13. /*-------------------------------グローバル変数------------------------------*/
  14. static    struct    FILEDATA
  15. {
  16.     char    name[13];
  17.     int    attr;
  18.     int    time[6];
  19. } File;
  20.  
  21. static    int    Pos;
  22. static    int    No;
  23. /*-------------------DIRENTRY構造体をFILEDATA構造体にコピー------------------*/
  24. static    void    mkcopy(void)
  25. {
  26.     unsigned    i;
  27.  
  28.     File.attr = Dirtbl[No]->attr;
  29.  
  30.     i = Dirtbl[No]->date;
  31.     File.time[0] = ((i>>9)+80) % 100;
  32.     File.time[1] = (i>>5) & 15;
  33.     File.time[2] = i & 31;
  34.  
  35.     i = Dirtbl[No]->time;
  36.     File.time[3] = i >> 11;
  37.     File.time[4] = (i>>5) & 63;
  38.     File.time[5] = (i & 31) << 1;
  39.  
  40.     for    (i=0 ; i<8 ; i++)
  41.     {
  42.         File.name[i] = Dirtbl[No]->filename[i];
  43.         if    (File.name[i]=='\x05')
  44.             File.name[i] = '\xe5';
  45.     }
  46.  
  47.     if    (File.attr & _A_VOLID)
  48.     {
  49.         for    (i=0 ; i<3 ; i++)
  50.             File.name[i+8] = Dirtbl[No]->extname[i];
  51.  
  52.         File.name[11] = '\0';
  53.     }
  54.     else
  55.     {
  56.         File.name[8] = '.';
  57.         for    (i=0 ; i<3 ; i++)
  58.             File.name[i+9] = Dirtbl[No]->extname[i];
  59.  
  60.         File.name[12] = '\0';
  61.     }
  62. }
  63. /*--------------------------画面にデータを表示する---------------------------*/
  64. static    void    showdata(int p)
  65. {
  66.     if    (p==Pos)
  67.         printf("\033[7m");
  68.  
  69.     if    (p==0)
  70.         printf("\033[23;3f%-12s\033[23;3f",File.name);
  71.     else if    (p<=6)
  72.     {
  73.         printf("\033[23;%df",16+p);
  74.  
  75.         if    (File.attr & (64>>p))
  76.             putchar(" ADVSHR"[p]);
  77.         else
  78.             putchar('-');
  79.  
  80.         putchar('\b');
  81.     }
  82.     else
  83.         printf("\033[23;%df%2d",p*3+4,File.time[p-7]);
  84.  
  85.     printf("\033[0m");
  86. }
  87. /*-----------------------画面のカーソルを表示/消去する----------------------*/
  88. static    void    putcursor(int f)
  89. {
  90.     printf("\033[19;1f" "\033[%dv" "\033[>1%c\033[2K",
  91.                     !f,(f?'l':'h'));
  92. }
  93. /*----------------------File.nameにファイル名を設定する----------------------*/
  94. void    filename_expand(char *buf)
  95. {
  96.     char        fcb[12];
  97.     int        i;
  98.     union    REGS    reg;
  99.  
  100.     reg.x.ax = 0x2900;
  101.     reg.x.si = (unsigned)buf;
  102.     reg.x.di = (unsigned)fcb;
  103.     int86(0x21,®,®);
  104.  
  105.     if    (reg.h.al!=0)    /* ワイルドカードが含まれる? */
  106.         return;
  107.  
  108.     for    (i=0 ; i<8 ; i++)
  109.         File.name[i] = fcb[i+1];
  110.  
  111.     File.name[9] = '.';
  112.  
  113.     for    (i=0 ; i<3 ; i++)
  114.         File.name[i+9] = fcb[i+9];
  115.  
  116.     File.name[12] = '\0';
  117. }
  118. /*----------------FILEDATA構造体からDIRENTRY構造体に書き戻す-----------------*/
  119. static    void    restore(void)
  120. {
  121.     /* データは正しいと仮定し、ここではエラーチェックはいっさいしない */
  122.  
  123.     Dirtbl[No]->attr = File.attr;
  124.     Dirtbl[No]->date = ( (File.time[0]+20)%100 << 9 )
  125.                  + (File.time[1]<<5) + File.time[2];
  126.     Dirtbl[No]->time = (File.time[3]<<11) + (File.time[4]<<5) 
  127.                 + (File.time[5]>>1);
  128.  
  129.     if    (File.attr & _A_VOLID)
  130.     {
  131.         int    i;
  132.         for    (i=0 ; i<11 ; i++)
  133.             Dirtbl[No]->filename[i] = File.name[i];
  134.     }
  135.     else
  136.     {
  137.         int    i;
  138.  
  139.         for    (i=0 ; i<8 ; i++)
  140.             Dirtbl[No]->filename[i] = File.name[i];
  141.  
  142.         for    (i=0 ; i<3 ; i++)
  143.             Dirtbl[No]->extname[i] = File.name[9+i];
  144.     }
  145.  
  146.     if    (Dirtbl[No]->filename[0]=='\xe5')
  147.         Dirtbl[No]->filename[0] = '\x05';
  148. }
  149. /*-------タイムスタンプの入力データが正しい範囲におさまっているか調べる------*/
  150. static    int    islegalnumber(int a)
  151. {
  152.     switch    (Pos)
  153.     {
  154.     case 7:    a = (a>=0 && a<100);    break;
  155.     case 8:    a = (a>=1 && a<=12);    break;
  156.     case 9:    a = (a>=1 && a<=31);    break;
  157.             /* 4月30日など存在しない日付も認めてしまう(^_^;) */
  158.     case 10:a = (a>=0 && a<24);    break;
  159.     case 11:a = (a>=0 && a<60);    break;
  160.     case 12:a = (a>=0 && a<60);    break;
  161.     }
  162.  
  163.     return a;
  164. }
  165. /*--------------------------------メインルーチン-----------------------------*/
  166. int    dmrename(unsigned no)
  167. {
  168.     char    buf[13];
  169.     char    c;
  170.     int    i;
  171.  
  172.     No = no;
  173.     mkcopy();
  174.  
  175.     Pos=0;
  176.     printf("\033[23;25f  /  /     :  :    %10ldbytes\n",
  177.                     Dirtbl[no]->filesize);
  178.  
  179.     for    (i=12 ; i>=0 ; i--)    /* 最後にファイル名を表示するため */
  180.         showdata(i);        /* 後ろから順に出力 */
  181.  
  182. rep:
  183.     c = dm_getch();
  184.     if    (c==RIGHTKEY && Pos<12)
  185.     {
  186.         showdata(Pos++);
  187.         showdata(Pos);
  188.         goto rep;
  189.     }
  190.     else if    (c==LEFTKEY && Pos>0)
  191.     {
  192.         showdata(Pos--);
  193.         showdata(Pos);
  194.         goto rep;
  195.     }
  196.     else if    (c=='\033')
  197.     {
  198.         printf("\033[23;1f\033[2K");
  199.         return 0;
  200.     }
  201.     else if    (c=='\r')
  202.     {
  203.         restore();
  204.         printf("\033[23;1f\033[2K");
  205.         return 1;
  206.     }
  207.  
  208.     else if    (Pos==0)    /* ファイル名 */
  209.     {
  210.         if    (iscntrl((unsigned char)c))
  211.             goto beep;
  212.         if    (File.name[0]=='.')    /* "." ".."は名前変更不可 */
  213.             goto beep;
  214.  
  215.         buf[0] = '\0';
  216.         dm_ungetch(c);
  217.  
  218.         putcursor(1);
  219.         printf("\033[23;3f");
  220.  
  221.         if    (strinput(buf,12))
  222.         {
  223.             if    (File.attr & _A_VOLID)
  224.                 sprintf(File.name,"%-11.11s",buf);
  225.             else
  226.                 filename_expand(buf);
  227.         }
  228.  
  229.         putcursor(0);
  230.     }
  231.     else if    (Pos<=6)    /* 属性 */
  232.     {
  233.         if    (Pos==2 || Pos==3)    /* _A_SUBDIR/_A_VOLIDビット */
  234.             goto beep;
  235.  
  236.         if    (c==UPKEY)
  237.             File.attr |= 64>>Pos;
  238.         else if    (c==DOWNKEY)
  239.             File.attr &= ~(64>>Pos);
  240.         else
  241.             goto beep;
  242.     }
  243.     else            /* タイムスタンプ */
  244.     {
  245.         if    (iscntrl((unsigned char)c))
  246.             goto beep;
  247.  
  248.         dm_ungetch(c);
  249.         buf[0] = '\0';
  250.  
  251.         putcursor(1);
  252.         printf("\033[23;%df",Pos*3+4);
  253.  
  254.         if    (strinput(buf,2))
  255.         {
  256.             int    a = atoi(buf);
  257.  
  258.             if    (islegalnumber(a))
  259.                 File.time[Pos-7] = a;
  260.         }
  261.  
  262.         putcursor(0);
  263.     }
  264.     showdata(Pos);
  265.     goto rep;
  266. beep:
  267.     putchar('\a');
  268.     goto rep;
  269. }
  270.